﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Onshi.POS.AccesoDatos;
using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.Modelo.Entidades;

namespace Onshi.POS.Repositorios
{
    public class RepositorioPromocion : RepositorioEntidad<Promocion, Int32>
    {
        #region Constructores

        public RepositorioPromocion()
            : base()
        {
            servicioDatosPromocion = new ServicioDatosPromocion();
            repositorioTipoFormaPago = new RepositorioTipoFormaPago();
        }

        #endregion

        #region Atributos

        private IServicioDatosPromocion servicioDatosPromocion;
        private RepositorioTipoFormaPago repositorioTipoFormaPago;
        #endregion

        #region Propiedades

        private IServicioDatosPromocion ServicioDatosPromocion
        {
            get { return servicioDatosPromocion; }
        }

        public RepositorioTipoFormaPago RepositorioTipoFormaPago
        {
            get { return repositorioTipoFormaPago; }
        }
        #endregion

        #region Metodos

        protected override Promocion FilaAEntidad(DataRow fila)
        {
            Promocion promocion = new Promocion();
            promocion.Id = (Int32)fila["IdPromocion"];
            promocion.TipoFormaPago = RepositorioTipoFormaPago.DevolverPorId((Byte)fila["IdTipoFormaPago"]);
            promocion.Nombre = (String)fila["Nombre"];
            promocion.FechaDesde = (DateTime)fila["FechaDesde"];
            promocion.FechaHasta = (DateTime)fila["FechaHasta"];
            promocion.Lunes = (Boolean)fila["lunes"];
            promocion.Martes = (Boolean)fila["martes"];
            promocion.Miercoles = (Boolean)fila["miercoles"];
            promocion.Jueves = (Boolean)fila["jueves"];
            promocion.Viernes = (Boolean)fila["viernes"];
            promocion.Sabado = (Boolean)fila["sabado"];
            promocion.Domingo = (Boolean)fila["domingo"];
            promocion.Observacion = (String)fila["observacion"];
            promocion.Cantidad = (Int32)fila["cantidad"];
            promocion.HoraDesde = (TimeSpan)fila["HoraDesde"];
            promocion.HoraHasta = (TimeSpan)fila["HoraHasta"];
            promocion.Descuento = (Decimal)fila["Descuento"];
            return promocion;
        }

        public override Promocion DevolverPorId(Int32 id)
        {
            Promocion entidad = (from Promocion item in entidades where item.Id == id select item).FirstOrDefault();
            if (entidades != null)
            {
                using (DataSet ds = ServicioDatosPromocion.Promociones_DevolverPorId(id))
                {
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        entidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(entidad);
                    }
                }
            }
            return entidad;
        }

        public void Insertar(Promocion entidad)
        {
            entidad.Id = ServicioDatosPromocion.Promociones_Insertar(entidad.TipoFormaPago.Id, entidad.Nombre, entidad.FechaDesde, entidad.FechaHasta, entidad.Lunes, entidad.Martes, entidad.Miercoles, entidad.Jueves, entidad.Viernes, entidad.Sabado, entidad.Domingo, entidad.Observacion, entidad.Cantidad, entidad.HoraDesde, entidad.HoraHasta, entidad.Descuento);
        }

        public void Modificar(Promocion entidad)
        {
            ServicioDatosPromocion.Promociones_Modificar(entidad.Id, entidad.TipoFormaPago.Id, entidad.Nombre, entidad.FechaDesde, entidad.FechaHasta, entidad.Lunes, entidad.Martes, entidad.Miercoles, entidad.Jueves, entidad.Viernes, entidad.Sabado, entidad.Domingo, entidad.Observacion, entidad.Cantidad, entidad.HoraDesde, entidad.HoraHasta, entidad.Descuento);
        }

        public void Eliminar(Promocion entidad)
        {
            ServicioDatosPromocion.Promociones_Eliminar(entidad.Id);
            entidad = null;
        }

        public List<Promocion> DevolverTodos()
        {
            using (DataSet ds = ServicioDatosPromocion.Promociones_DevolverTodos())
            {
                entidades = TablaALista(ds.Tables[0]);
            }
            return entidades;
        }

        #endregion
    }
}
